/* The file is saved in UTF-8 codepage.
 * Check: «Stereotype», Section mark-§, Copyright-©, Alpha-α, Beta-β, Smile-☺
 */
package cz.pecinovsky.english.lootp._115_;


import cz.pecinovsky.english.lootp._parents._ILight_120_124;
import cz.pecinovsky.english.lootp.manager.Ellipse;
// %I+ <124
//import cz.pecinovsky.english.lootp.manager.chozí.IPaintable;
// %I-
import cz.pecinovsky.english.lootp.manager.IMoveable;
import cz.pecinovsky.english.lootp.manager.Painter;

import cz.pecinovsky.english.lootp.utility.Position;

import cz.pecinovsky.english.lootp.utility.NamedColor;
import cz.pecinovsky.english.lootp.utility.IO;


////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ End of ignored starting test - place for imports +++++
//%X+ xxxxx Start of the ovejumped text with declaration of the envelope xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí: _117_Světlo_119
 *
 * Projekt  020z_11_Správce
 *  + Doplněny dokumentační komentáře
 *</pre>
 */
public class Light_120_124
{    private Light_120_124() {}    static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- End of the ovejumped text with declaration of the envelope -----


/*******************************************************************************
 * Instance třídy {@code Light} představují simulovaná světla,
 * která se umějí rozsvítit a zhasnout.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
//%I+ <124
//public class Light implements IPaintable
//%I-
//%A+ >124
public class Light implements IMoveable
//%A-
//%A+ <0
        ,   _ILight_120_124
//%A-
{
//== CONSTANT CLASS ATTRIBUTES =================================================
//== VARIABLE CLASS ATTRIBUTES =================================================
//== STATIC CONSTRUCTOR (CLASS INITIALIZER, STATIC INICITALIZING BLOCK) ========
//== CONSTANT INSTANCE ATTRIBUTES ==============================================

    /** NamedColor rozsvíceného světla. */
    private NamedColor  color;
//%A+ >122

    /** NamedColor zhsanutého světla. */
    private NamedColor switchedOff;
//%A-

    /** Obrazec představující light na plátně. */
    private Ellipse bulb;



//== VARIABLE INSTANCE ATTRIBUTES ==============================================
//== CLASS GETTERS AND SETTERS =================================================
//== OTHER NON-PRIVATE CLASS METHODS ===========================================

//##############################################################################
//== CONSTUCTORS AND FACTORY METHODS ===========================================

    /***************************************************************************
     * Vytvoří light implicitních rozměrů a barvy
     * umístěné v imlicitní pozici (levý horní roh plátna).
     */
    public Light()
    {
//%I+ <121
//        bulb  = new Ellipse();
//        color = bulb.getColor();
//%I-
//%A+ >121
        this(0, 0);
//%A-
    }


    /***************************************************************************
     * Vytvoří light implicitních rozměrů a barvy
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     */
    public Light(int x, int y)
    {
//%I+ <121
//        bulb  = new Ellipse(x, y, 50, 50);
//        color = bulb.getColor();
//%I-
//%A+ >121
        this(x, y, NamedColor.YELLOW);
//%A-
    }


    /***************************************************************************
     * Vytvoří light implicitních rozměrů zadané barvy rozsvíceného světla
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
//%I+ <121
//     * @param b  NamedColor rozsvíceného světla
//%I-
//%A+ >121
     * @param color  NamedColor rozsvíceného světla
//%A-
     */
//%I+ =120z
//    public Light(int x, int y, NamedColor b)
//    {
//        color = b;
//        bulb  = new Ellipse(x, y, 50, 50, color);
//    }
//%I-
//%A+ >121
    public Light(int x, int y, NamedColor color)
    {
//%A-
//%I+ =121z
//        this.color = color;
//        this.bulb  = new Ellipse(x, y, 50, 50, color);
//    }
//%I-
//%A+ >122
        this(x, y, 50, color);
    }


    /***************************************************************************
     * Vytvoří light zadaných rozměrů a implicitních barev
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param diameter Průměr vytváreného světla
     */
    public Light(int x, int y, int diameter)
    {
        this(x, y, diameter, NamedColor.YELLOW);
    }


    /***************************************************************************
     * Vytvoří light zadaných rozměrů a zadané barvy rozsvíceného světla
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param diameter Průměr vytváreného světla
     * @param color  NamedColor rozsvíceného světla
     */
    public Light(int x, int y, int diameter, NamedColor color)
    {
        this(x, y, diameter, color, NamedColor.BLACK);
    }


    /***************************************************************************
     * Vytvoří light zadaných rozměrů a
     * zadané barvy rozsvíceného i zhasnutého světla
     * umístěné na zadaných souřadnicích.
     *
     * @param x  Vodorovná souřadnice vytvářeného světla
     * @param y  Svislá souřadnice vytvářeného světla
     * @param diameter   Průměr vytváreného světla
     * @param color    NamedColor rozsvíceného světla
     * @param switchedOff NamedColor zhasnutého světla
     */
    public Light(int x, int y, int diameter, NamedColor color, NamedColor switchedOff)
    {
        this.color       = color;
        this.switchedOff = switchedOff;
        this.bulb        = new Ellipse(x, y, diameter, diameter, color);
    }
//%A-



//== ABSTRACT METHODS ==========================================================
//== INSTANCE GETTERS AND SETTERS ==============================================
//%A+ >124

    /***************************************************************************
     * Vrátí barvu rozsvíceného světla.
     *
     * @return  NamedColor rozsvíceného světla
     */
//%A-
//%A+ <0
    @Override
//%A-
//%A+ >124
    public NamedColor getColor()
    {
        return color;
    }

//%A-
//%A+ >124

    // Sada přístupových metod vlastnosti: Position ******************************

    /***************************************************************************
     * Vrátí x-ovou (vodorovnou) souřadnici pozice instance.
     *
     * @return  x-ová souřadnice.
     */
    @Override
    public int getX()
    {
        return bulb.getX();
    }


    /***************************************************************************
     * Vrátí y-ovou (svislou) souřadnici pozice instance.
     *
     * @return  y-ová souřadnice.
     */
    @Override
    public int getY()
    {
        return bulb.getY();
    }

//%A-
//%A+ >125

    /***************************************************************************
     * Vrátí přepravku se svojí aktuální pozicí.
     *
     * @return Aktuální pozice světla
     */
//%A-
//%A+ <0
     @Override
//%A-
//%A+ >125
    public Position getPosition()
    {
        return new Position(getX(), getY());
    }


    /***************************************************************************
     * Nastaví novou pozici světla.
     *
     * @param p Nastavovaná pozice
     */
//%A-
//%A+ <0
     @Override
//%A-
//%A+ >125
    public void setPosition(Position p)
    {
        this.setPosition(p.x, p.y);
    }

//%A-
//%A+ >123

    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
//%A-
//%A+ >124
    @Override
//%A-
//%A+ >123
    public void setPosition(int x, int y)
    {
        bulb.setPosition(x, y);
    }

//%A-
//%A+ >124

    // Sada přístupových metod vlastnosti: Rozměr / Modul **********************

    /***************************************************************************
     * Vrátí diameter daného světla.
     *
     * @return Průměr světla
     */
//%A-
//%A+ <0
     @Override
//%A-
//%A+ >124
    public int getDiameter()
    {
        return bulb.getHeight();
    }


    /***************************************************************************
     * Vrátí základní délku, od níž se odvozují všechny rozměry objektu -
     * pro světla je to jejich diameter.
     *
     * @return Průměr světla
     */
//%A-
//%A+ <0
     @Override
//%A-
//%A+ >124
    public int getModule()
    {
        return getDiameter();
    }

//%A-
//%A+ >123

    /***************************************************************************
     * Nastaví nový module = diameter (kruhového) světla.
     *
     * @param module  Nastavovaný diameter; diameter > 0
     */
//%A-
//%A+ <0
     @Override
//%A-
//%A+ >123
    public void setModule(int module)
    {
        bulb.setSize(module);
    }

//%A-
//%A+ >124

    /***************************************************************************
     * Vrátí informaci o tom, je-li light právě zhasnuté.
     *
     * @return Je-li zhasnuté, vrátí {@code true}, jinak vrátí {@code false}
     */
//%A-
//%A+ <0
     @Override
//%A-
//%A+ >124
    public boolean isOff()
    {
        return bulb.getColor().equals(switchedOff);
    }

//%A-
//%A+ >123


//%A-
//== OTHER NON-PRIVATE INSTANCE METHODS ========================================

    /***************************************************************************
     * Light na půl vteřiny rozsvítí a pak je zase zhasne..
     */
//%A+ <0
     @Override
//%A-
    public void blink()
    {
        switchOn();
        IO.pause(500);
        switchOff();
    }


    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param painter Painter, které nakreslí instanci
     */
    @Override
    public void paint(Painter painter)
    {
        bulb.paint(painter);
    }


    /***************************************************************************
     * Rozsvítí dané light, tj. vybarví je barvou rozsvíceného světla.
     */
//%A+ <0
     @Override
//%A-
    public void switchOn()
    {
        bulb.setColor(color);
    }


    /***************************************************************************
     * Zhasne dané light, tj. vybarví je barvou pro zhasnuté light.
     */
//%A+ <0
     @Override
//%A-
    public void switchOff()
    {
//%I+ <122
//        bulb.setColor(NamedColor.BLACK);
//%I-
//%A+ >122
        bulb.setColor(switchedOff);
//%A-
    }



//== PRIVATE AND AUXILIARY CLASS METHODS =======================================
//== PRIVATE AND AUXILIARY INSTANCE METHODS ====================================
//== EMBEDDED TYPES AND INNER CLASSES ==========================================
//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        Light inst = new Light();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main(String[] args)  {  test();  }
    }


//%%- ---- Start of the ovejumped text with closing of the envelope ----
////////////////////////////////////////////////////////////////////////////////
//%== //Takto se označí řádek, jenž bude odkomentován (vhodné např. pro importy)
//Je-li na 6 pozici mezera, odmaže se také

//== TESTING CLASSES AND METHODS ===============================================
//
//    /***************************************************************************
//     * Test method.
//     */
//    public static void test()
//    {
//        System.exit(0);
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main(String[] args)  {  test();  }
}
